iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
自我挑戰組

前端工程師的java學習紀錄系列 第 13

Day13-class method的重載與參數

  • 分享至 

  • xImage
  •  

Java當中是支援方法重載overload

重載 overload

overload 指的是可以定義相同的方法名稱,但是當參數的個數型別不同,在Java中不會出現錯誤,且當調用方法時,Java會判斷該使用哪一個方法。

程式碼:

class People {
	// 定義屬性
	String name;
	int age;
	
	public void drink(double ml){
	}
	
	public void drink(String day, double ml){
		System.out.println(name + day + "天喝了" + ml + "cc的水"); 
	}
	
	public void drink(double ml, double cc){}
}

上面這樣,定義了三個drink 方法,但是由於參數個數 不同,型別 就算有一個相同,但是只要個數不同,依然符合overload 的格式。

特別要注意的是編譯器

  • 只看參數個數型別
  • 不看權限修飾符型別返回值

Java的編譯器在判斷類的方法時,首先是先看方法名稱,不同時則判斷為不同的方法,相同時再去判斷參數的個數型別

遇到型別提昇的情況時,編譯器會先調用相同型別的方法,除非型別中其中一個參數需要提昇時,才會去調用符合情況的方法

程式碼:

public class PeopleTest{

	public static void main(String[] args) {
		People people = new People();
			people.name = "Jack";
			people.drink(1000.0); // 喝了1000.0cc的水
			people.drink(50); // 喝了50cc的水
			people.drink(150.9, 50) // ml = 150.9 , cc = 50.0
			
		}
		
		
		
	class People {
		// 定義屬性
		String name;
		int age;
	
		public void drink(double ml) {
			System.out.println("喝了" + ml + "cc的水"); 
		}
		
		public void drink(int ml) {
			System.out.println("喝了" + ml + "cc的水"); 
		}
	
		public void drink(String day, double ml) {
			System.out.println(name + day + "天喝了" + ml + "cc的水"); 
		}
	
		public void drink(double ml, double cc) {
			System.out.println("ml = " + ml + ", cc = " + cc); 
		}
	}
}

可以看到在第四個drink() 方法中,雖然第二個參數寫的是int 型別50 ,但是實際上Java會將它提昇為double型別50.0


確定型別、不確定個數的參數

在Java中寫方法時,有時候會確定參數型別,但是不確定參數的個數,這時候可以這樣寫

格式:
(型別 …參數名稱)

public class People {
	public static void main(String[] args) {
		People people = new People();
		
		people.saySomething("hello","world","!");
	}
	public void saySomething(String ...strs) {
	}
}

當參數除了不確定的數量外,還有其他的參數有聲明時,需要將...args 放在參數的最後

例如:

public void saySomething(String name, String ...strs) {
}

過去沒有...args 的寫法時,是使用Public void saySomething(String[] strs) {} 方式去定義不確定的參數個數,所以這樣的寫法是會出現報錯,因為編譯器認為這兩個是一樣的方式。

第一種:

Public void saySomething(String[] strs) {}

第二種:

Public void saySomething(String ...strs) {} 

使用第一種方式宣告時,在調用時需要在參數中先實例化 這個陣列才能夠使用

Public void saySomething(String[] strs) {}

saySomething(new String[]{"hello","world"}

要遍歷...args 時,可以使用for 循環去調用

Public void saySomething(String ...strs) {
	for(int i = 0; i < strs.length; i++) {
		System.out.print(strs[i] + "\t");
	}
}

當有overload 的情況時,會優先確認是否有相同個數的參數 ,若找不到時才會去調用聲明...args 的方法

Public void saySomething(String ...strs) {
	System.out.print("3333");
} 

Public void saySomething(String str1, String str2) {
	System.out.print("2222");
}

Public void saySomething(String str) {
	System.out.print("1111");
} 

saySomething(String "hello") // 1111
 
saySomething(String "hello",String "world") // 2222
 
saySomething(String "hello",String "hello",String "world") // 3333

saySomething(); // 3333

當沒有放任何參數時,也會調用使用...args 的這個方法。


上一篇
Day12-類(記憶體中的表現方式)
下一篇
Day14-參數與遞迴
系列文
前端工程師的java學習紀錄38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言